/*
 * Created by VS2005Express
 * user: Ramayac
 */
using System;
using System.Data;
using System.Collections.Generic;
using DataLayer;
using MySql.Data.MySqlClient;

namespace Inventador
{
	public class Producto
	{
		#region Campos
		
        //id, tipo, marca, existencia_actual, existencia_minima
		private int _id;
        private TipoProducto _fktipo;
        private MarcaProducto _fkmarca;
        private int _existactual, _existminima;
        private string _descripcion;
        private int _existencia_ideal;
        private Area _miarea;
		
		#endregion
		
		#region Propiedades
		
		public int Id
		{
			get { return this._id; }
			set { this._id = value; }
		}

        public TipoProducto fkTipoProducto
        {
            get { return this._fktipo; }
            set { this._fktipo = value; }
        }

        public MarcaProducto fkMarcaProducto
        {
            get { return this._fkmarca; }
            set { this._fkmarca = value; }
        }

        public int ExistenciaActual
        {
            get { return this._existactual; }
            set { this._existactual = value; }
        }

        public int ExistenciaMinima
        {
            get { return this._existminima; }
            set { this._existminima = value; }
        }
        
        public string Descripcion
        {
        	get { return this._descripcion; }
        	set { this._descripcion = value; }
        }
        
        public int ExistenciaIdeal
        {
        	get { return this._existencia_ideal; }
        	set { this._existencia_ideal = value; }
        }
        
        public Area MiArea
        {
        	get { return this._miarea; }
        	set { this._miarea = value; }
        }

		#endregion
		
		#region Metodos

        //id, tipo, marca, existencia_actual, existencia_minima
		public Producto(int pId, TipoProducto pTipoProducto, MarcaProducto pMarcaProducto, int pExistActual, int pExistMinima, string pDescripcion, int pExistenciaIdeal, Area pArea)
		{
			this.Id = pId;
            this.fkTipoProducto = pTipoProducto;
            this.fkMarcaProducto = pMarcaProducto;
            this.ExistenciaActual = pExistActual;
            this.ExistenciaMinima = pExistMinima;
            this.Descripcion = pDescripcion;
            this.ExistenciaIdeal = pExistenciaIdeal;
            this.MiArea = pArea;
		}
		
		public bool GetFromDb(BaseDatos bdatos)
		{
			bdatos = new BaseDatos();
			bdatos.Conectar();
			MySqlDataReader lector = bdatos.EjecutarConsulta("SELECT * FROM Producto AS pr WHERE id=" + this.Id.ToString());
			if(lector.HasRows)
			{
				lector.Read();
				this.fkTipoProducto = new TipoProducto(0, "", null);
				this.MiArea = new Area(int.Parse(lector["area"].ToString()), "");
				this.MiArea.GetFromDb(bdatos);
		                this.fkTipoProducto.Id = int.Parse(lector["tipo"].ToString());
		                this.fkTipoProducto.GetFromDb(bdatos);
		                this.fkMarcaProducto = new MarcaProducto(0, "");
		                this.fkMarcaProducto.Id = int.Parse(lector["marca"].ToString());
		                this.fkMarcaProducto.GetFromDb(bdatos);
		                this.ExistenciaActual = int.Parse(lector["existencia_actual"].ToString());
		                this.ExistenciaMinima = int.Parse(lector["existencia_minima"].ToString());
		                this.Descripcion = lector["descripcion"].ToString();		                
		                if(!lector.IsDBNull(6))
		                	this.ExistenciaIdeal = int.Parse(lector["existencia_ideal"].ToString());
		                else
		                	this.ExistenciaIdeal = 0;
				bdatos.Desconectar();
				return true;
			}
			bdatos.Desconectar();
			return false;
		}
		
		public bool GetFromDbByTipo(BaseDatos bdatos)
		{
			bdatos = new BaseDatos();
			bdatos.Conectar();
            MySqlDataReader lector = bdatos.EjecutarConsulta("SELECT * FROM Producto AS pr WHERE tipo=" + this.fkTipoProducto.Id.ToString());
			if(lector.HasRows)
			{
                lector.Read();
                this.Id = int.Parse(lector["id"].ToString());
                this.MiArea = new Area(int.Parse(lector["area"].ToString()), "");
		  this.MiArea.GetFromDb(bdatos);
                this.fkTipoProducto.GetFromDb(bdatos);
                this.fkMarcaProducto.Id = int.Parse(lector["marca"].ToString());
                this.fkMarcaProducto.GetFromDb(bdatos);
                this.ExistenciaActual = int.Parse(lector["existencia_actual"].ToString());
                this.ExistenciaMinima = int.Parse(lector["existencia_minima"].ToString());
                this.Descripcion = lector["descripcion"].ToString();
                  if(!lector.IsDBNull(6))
                  	this.ExistenciaIdeal = int.Parse(lector["existencia_ideal"].ToString());
		    else
		       this.ExistenciaIdeal = 0;
                bdatos.Desconectar();
                return true;
			}
			bdatos.Desconectar();
			return false;
		}

        public bool GetFromDbByMarca(BaseDatos bdatos)
        {
        	bdatos = new BaseDatos();
            bdatos.Conectar();
            //TODO: Esto lo veo BIEN inseguro "this.fkMarcaProducto.Id.ToString()", GO OPENRANGER GO!!! :D
            MySqlDataReader lector = bdatos.EjecutarConsulta("SELECT * FROM Producto AS pr WHERE marca=" + this.fkMarcaProducto.Id.ToString());
            if (lector.HasRows)
            {
                lector.Read();
                this.Id = int.Parse(lector["id"].ToString());
                this.MiArea = new Area(int.Parse(lector["area"].ToString()), "");
		  this.MiArea.GetFromDb(bdatos);
                this.fkTipoProducto.GetFromDb(bdatos);
                this.fkMarcaProducto.Id = int.Parse(lector["marca"].ToString());
                this.fkMarcaProducto.GetFromDb(bdatos);
                this.ExistenciaActual = int.Parse(lector["existencia_actual"].ToString());
                this.ExistenciaMinima = int.Parse(lector["existencia_minima"].ToString());
                this.Descripcion = lector["descripcion"].ToString();
                  if(!lector.IsDBNull(6))
                  	this.ExistenciaIdeal = int.Parse(lector["existencia_ideal"].ToString());
		    else
		       this.ExistenciaIdeal = 0;
                bdatos.Desconectar();
                return true;
            }
            bdatos.Desconectar();
            return false;
        }
		
        //TODO: Con esto... no habria que hacer un GetFromDB por Existencia Actual/Minima, right?
		public static List<Producto> GetList(BaseDatos bdatos, string condicion)
		{
			bdatos = new BaseDatos();
			List<Producto> lst = new List<Producto>();
			string consulta = "SELECT * FROM Producto AS pr";
			if(condicion != "") 
				consulta += " WHERE " + condicion;
			bdatos.Conectar();
			MySqlDataReader lector = bdatos.EjecutarConsulta(consulta);
            //TODO: ROBERTO: Please DOUBLE CHECK this part!!!
			if(lector.HasRows)
                while (lector.Read())
                {
                    MarcaProducto foo = new MarcaProducto(int.Parse(lector["marca"].ToString()), "");
                    TipoProducto bar = new TipoProducto(int.Parse(lector["tipo"].ToString()), "", null);
                    Area ar = new Area(int.Parse(lector["area"].ToString()), "");
                    ar.GetFromDb(bdatos);
                    foo.GetFromDb(bdatos);
                    bar.GetFromDb(bdatos);
                    int eact = int.Parse(lector["existencia_actual"].ToString());
                    int emin = int.Parse(lector["existencia_minima"].ToString());
                    int extIdeal = (lector.IsDBNull(6)? 0: int.Parse(lector["existencia_ideal"].ToString()));
                    lst.Add(new Producto(int.Parse(lector["id"].ToString()), bar, foo, eact, emin, lector["descripcion"].ToString(), extIdeal, ar));
                }
			bdatos.Desconectar();
            return lst;
		}

		public void Insert(BaseDatos bdatos)
		{
			bdatos = new BaseDatos();
			bdatos.Conectar();
            //id, tipo, marca, existencia_actual, existencia_minima, descripcion
            bdatos.EjecutarOperacion("INSERT INTO Producto VALUES(" + this.Id.ToString() + ", " + this.fkTipoProducto.Id.ToString() + ", " + this.fkMarcaProducto.Id.ToString() + ", " + this.ExistenciaActual.ToString() + ", " + this.ExistenciaMinima.ToString() + ", '" + this.Descripcion + "', " + this.ExistenciaIdeal.ToString() + ", " + this.MiArea.Id.ToString() +  " )");
			bdatos.Desconectar();
		}
		
		public void Update(BaseDatos bdatos)
		{
			bdatos = new BaseDatos();
			bdatos.Conectar();
            bdatos.EjecutarOperacion("UPDATE Producto SET tipo=" + this.fkTipoProducto.Id.ToString() + 
                ", marca=" + this.fkMarcaProducto.Id.ToString() +
                ", existencia_actual=" + this.ExistenciaActual.ToString() +
                ", existencia_minima=" + this.ExistenciaMinima.ToString() +
                ", descripcion = '" + this.Descripcion + 
                "', existencia_ideal=" + this.ExistenciaIdeal.ToString() + 
                ", area = " + this.MiArea.Id +
                " WHERE id=" + this.Id.ToString());
			bdatos.Desconectar();
		}
		
		public void Delete(BaseDatos bdatos)
		{
			bdatos = new BaseDatos();
			bdatos.Conectar();
            bdatos.EjecutarOperacion("DELETE FROM Producto WHERE id=" + this.Id.ToString());
			bdatos.Desconectar();
		}
		
		public static int GetMaxId(BaseDatos bdatos)
		{
			bdatos = new BaseDatos();
			bdatos.Conectar();
			int maxId = bdatos.EjecutarEscalar("SELECT MAX(id) FROM Producto");
			bdatos.Desconectar();
			return maxId;
		}
		
		public void ActualizarExistenciaActual(BaseDatos bdatos)
		{
			bdatos = new BaseDatos();
			int nuevaExtAct = 0;
			List<Movimiento> movs = Movimiento.GetListByProducto(bdatos, this.Id, "fecha");
			foreach(Movimiento mov in movs)
			{
				if(mov.TipoMovimiento == "Entrada")
					nuevaExtAct += mov.Cantidad;
				else
					nuevaExtAct -= mov.Cantidad;
			}
			this.ExistenciaActual = nuevaExtAct;
			this.Update(bdatos);
		}
		
		#endregion
	}
}
